package main

import (
	"fmt"
	"reflect"
)

type Student struct {
	Name string
	Age  int
}

func (s Student) Print() {
	fmt.Println("调用Print")
}

func (s Student) Getsum(n1, n2 int) int {
	fmt.Println("调用Getsum")
	return n1 + n2
}

func teststruct(a interface{}) {
	val := reflect.ValueOf(a)

	// //通过reflect.Value类型操作结构体内部的字段
	// n1 := val.NumField()
	// fmt.Println(n1)
	// for i := 0; i < n1; i++ {
	// 	fmt.Printf("%v\n", val.Field(i))
	// }
	// //通过reflect.Value类型操作结构体内部的方法
	// //调用方法的首字母必须大写，反射才有访问的权限
	// n2 := val.NumMethod()
	// fmt.Println(n2)
	// val.Method(1).Call(nil)

	// //定义一个value的切片
	// var params []reflect.Value
	// params = append(params, reflect.ValueOf(10))
	// params = append(params, reflect.ValueOf(20))
	// val.Method(0).Call(params)

	//修改结构体的值
	val.Elem().Field(0).SetString("李四")
}

func main() {
	s := Student{"张三", 21}
	teststruct(&s)
	fmt.Println(s)
}

// import (
// 	"fmt"
// 	"reflect"
// )

// // 反射修改基本数据类型的值
// func testReflect(i interface{}) {
// 	revalue := reflect.ValueOf(i)

// 	revalue.Elem().SetInt(200) //获取指针指向的值
// }

// func main() {
// 	var num int = 100
// 	testReflect(&num) //为了能够改变内部的值需要传指针
// 	fmt.Println(num)
// }

// import (
// 	"fmt"
// 	"reflect"
// )

// // 若想把结构体的value转换回value为了判断转换是否成功再用一个参数来存结果
// // 反射
// func testReflect(i interface{}) {
// 	retype := reflect.TypeOf(i)
// 	revalue := reflect.ValueOf(i)

// 	//获取变量的类别
// 	k1 := retype.Kind()
// 	fmt.Println(k1)

// 	//用value的kind
// 	k2 := revalue.Kind()
// 	fmt.Println(k2)
// }

// type student struct {
// 	name string
// 	age  int
// }

// func main() {
// 	s := student{"张三", 12}
// 	//fmt.Printf("%T", s)
// 	testReflect(s)
// }

// import (
// 	"fmt"
// 	"reflect"
// )

// // 若想把结构体的value转换回value为了判断转换是否成功再用一个参数来存结果
// // 反射
// func testReflect(i interface{}) {
// 	retype := reflect.TypeOf(i)
// 	revalue := reflect.ValueOf(i)

// 	fmt.Println("retype:", retype)
// 	fmt.Println("revalue:", revalue)

// 	value := revalue.Interface()
// 	fmt.Printf("%T\n", value)
// 	i2 := value.(int)
// 	n2 := i2 + 20
// 	fmt.Println(value, n2)
// }

// func main() {
// 	c := 100
// 	testReflect(c)
// }
